﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем ПредыдущийЯзык;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Источник = Параметры.Источник;
	Если Источник = "ПанельАдминистрированияБСП" Тогда
		Элементы.ОК.Заголовок = НСтр("ru = 'Изменить'")
	КонецЕсли;
	 
	ЗаполнитьЧасовыеПояса();
	
	Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
	
		ИнформационнаяБазаФайловая = ОбщегоНазначения.ИнформационнаяБазаФайловая();
		
		ЧасовойПоясПрограммы = ПолучитьЧасовойПоясИнформационнойБазы();
		Если ПустаяСтрока(ЧасовойПоясПрограммы) Тогда
			ЧасовойПоясПрограммы = ЧасовойПояс();
		КонецЕсли;
		
		Если ОбщегоНазначения.РазделениеВключено() Тогда
			Элементы.ГруппаОсновнойЯзык.Видимость = Ложь;
			Элементы.ГруппаДополнительныеЯзыки.Видимость = Ложь;
		КонецЕсли;
		
	Иначе
		
		ЧасовойПоясПрограммы = ЧасовойПоясСеанса();
		
	КонецЕсли;
	
	УстановитьОсновнойЯзык();
	
	Настройки = Новый Структура;
	Настройки.Вставить("КодДополнительногоЯзыка1", "");
	Настройки.Вставить("КодДополнительногоЯзыка2", "");
	Настройки.Вставить("МультиязычныеДанные",      Истина);
	
	МультиязычностьПереопределяемый.ПриОпределенииНастроек(Настройки);
	
	КоличествоЯзыков = Метаданные.Языки.Количество();
	Если Не Настройки.МультиязычныеДанные ИЛИ КоличествоЯзыков = 1 Тогда
		Элементы.ГруппаДополнительныеЯзыки.Видимость = Ложь;
		Элементы.ГруппаОсновнойЯзык.Видимость        = Ложь;
	Иначе
		Если КоличествоЯзыков = 2 Тогда
			Элементы.ГруппаДополнительныйЯзык2.Видимость = Ложь;
		КонецЕсли;
		ОтобразитьНастройкиДополнительныхЯзыков(Настройки, КоличествоЯзыков);
	КонецЕсли;
	
	ДанныеДляИзмененияМультиязычныхРеквизитов = МультиязычностьСервер.ДанныеДляИзмененияМультиязычныхРеквизитов();
	Если ДанныеДляИзмененияМультиязычныхРеквизитов <> Неопределено Тогда
		ПродолжитьИзменениеМультиязычныхРеквизитов = Истина;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Если ПродолжитьИзменениеМультиязычныхРеквизитов Тогда
		ПерезаполнитьДанные();
	КонецЕсли;
	
	Если ИнформационнаяБазаФайловая
		И СтрНайти(ПараметрЗапуска, "ВыполнитьОбновлениеИЗавершитьРаботу") > 0 Тогда
			ПодключитьОбработчикОжидания("УстановитьЗначенияПоУмолчанию", 0.1, Истина);
	КонецЕсли;
	 
	СмещениеЧасовогоПояса = ОбщегоНазначенияКлиент.ДатаСеанса() - ТекущиеВремяНаКлиенте();
	УстановитьВремя();
	
КонецПроцедуры

&НаСервере
Процедура УстановитьОсновнойЯзык()
	
	ОсновнойЯзык = Константы.ОсновнойЯзык.Получить();
	Для каждого Язык Из Метаданные.Языки Цикл
		Элементы.ОсновнойЯзык.СписокВыбора.Добавить(Язык.КодЯзыка, Язык.Представление());
	КонецЦикла;
	
	Если ПустаяСтрока(ОсновнойЯзык) Тогда
		ОсновнойЯзык = ТекущийЯзык().КодЯзыка;
	КонецЕсли;
	
	Если ПустаяСтрока(ОсновнойЯзык) Или Элементы.ОсновнойЯзык.СписокВыбора.НайтиПоЗначению(ОсновнойЯзык) = Неопределено Тогда
		ОсновнойЯзык = ОбщегоНазначения.КодОсновногоЯзыка();
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ОтобразитьНастройкиДополнительныхЯзыков(Настройки, КоличествоЯзыков)
	
	ДоступныеЯзыки = Новый Соответствие;
	Для каждого ЯзыкКонфигурации Из Метаданные.Языки Цикл
		Если СтрСравнить(ОсновнойЯзык, ЯзыкКонфигурации.КодЯзыка) = 0  Тогда
			Продолжить;
		КонецЕсли;
		ДоступныеЯзыки.Вставить(ЯзыкКонфигурации.КодЯзыка, Истина);
	КонецЦикла;
	
	Язык1ПоУмолчанию = "";
	Если ЗначениеЗаполнено(Настройки.КодДополнительногоЯзыка1) Тогда
		Если ДоступныеЯзыки.Получить(Настройки.КодДополнительногоЯзыка1) = Истина Тогда
			Язык1ПоУмолчанию = Настройки.КодДополнительногоЯзыка1;
		КонецЕсли;
	КонецЕсли;
	
	Язык2ПоУмолчанию = "";
	Если КоличествоЯзыков > 2 И ЗначениеЗаполнено(Настройки.КодДополнительногоЯзыка2) Тогда
		Если ДоступныеЯзыки.Получить(Настройки.КодДополнительногоЯзыка2) = Истина Тогда
			Язык2ПоУмолчанию = Настройки.КодДополнительногоЯзыка2;
		КонецЕсли;
	КонецЕсли;
	
	Для каждого Язык Из Метаданные.Языки Цикл
		Если СтрСравнить(Язык.КодЯзыка, ОсновнойЯзык) <> 0 Тогда
			Если ПустаяСтрока(Язык1ПоУмолчанию) Тогда
				Язык1ПоУмолчанию = Язык.КодЯзыка;
			ИначеЕсли ПустаяСтрока(Язык2ПоУмолчанию) И Язык.КодЯзыка <> Язык1ПоУмолчанию Тогда
				Язык2ПоУмолчанию = Язык.КодЯзыка;
			КонецЕсли;
		КонецЕсли;
		Элементы.ДополнительныйЯзык1.СписокВыбора.Добавить(Язык.КодЯзыка, Язык.Представление());
		Элементы.ДополнительныйЯзык2.СписокВыбора.Добавить(Язык.КодЯзыка, Язык.Представление());
	КонецЦикла;
	
	ИспользоватьДополнительныйЯзык1 = МультиязычностьСервер.ИспользуетсяПервыйДополнительныйЯзык();
	ИспользоватьДополнительныйЯзык2 = МультиязычностьСервер.ИспользуетсяВторойДополнительныйЯзык();
	
	ДополнительныйЯзык1 = МультиязычностьСервер.КодПервогоДополнительногоЯзыкаИнформационнойБазы();
	ДополнительныйЯзык2 = МультиязычностьСервер.КодВторогоДополнительногоЯзыкаИнформационнойБазы();
	
	Элементы.ДополнительныйЯзык1.Доступность = ИспользоватьДополнительныйЯзык1;
	Элементы.ДополнительныйЯзык2.Доступность = ИспользоватьДополнительныйЯзык2;
	
	Если ПустаяСтрока(ДополнительныйЯзык1) Тогда
		ДополнительныйЯзык1 = Язык1ПоУмолчанию;
	КонецЕсли;
	
	Если КоличествоЯзыков > 2 И ПустаяСтрока(ДополнительныйЯзык2) Тогда
		ДополнительныйЯзык2 = Язык2ПоУмолчанию;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ИспользоватьДополнительныйЯзык1ПриИзменении(Элемент)
	Элементы.ДополнительныйЯзык1.Доступность = ИспользоватьДополнительныйЯзык1;
КонецПроцедуры

&НаКлиенте
Процедура ИспользоватьДополнительныйЯзык2ПриИзменении(Элемент)
	Элементы.ДополнительныйЯзык2.Доступность = ИспользоватьДополнительныйЯзык2;
КонецПроцедуры

&НаКлиенте
Процедура ОсновнойЯзыкПриИзменении(Элемент)
	
	Если СтрСравнить(ПредыдущийЯзык, ОсновнойЯзык) <> 0 Тогда
		Если СтрСравнить(ДополнительныйЯзык1, ОсновнойЯзык) = 0 Тогда
			ДополнительныйЯзык1 = ПредыдущийЯзык;
		ИначеЕсли СтрСравнить(ДополнительныйЯзык2, ОсновнойЯзык) = 0 Тогда
			ДополнительныйЯзык2 = ПредыдущийЯзык;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОсновнойЯзыкНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ПредыдущийЯзык = ОсновнойЯзык;
КонецПроцедуры

&НаКлиенте
Процедура ДополнительныйЯзык1ПриИзменении(Элемент)
	
	Если СтрСравнить(ПредыдущийЯзык, ДополнительныйЯзык1) <> 0 Тогда
		Если СтрСравнить(ДополнительныйЯзык1, ОсновнойЯзык) = 0 Тогда
			ОсновнойЯзык = ПредыдущийЯзык;
		ИначеЕсли СтрСравнить(ДополнительныйЯзык1, ДополнительныйЯзык2) = 0 Тогда
			ДополнительныйЯзык2 = ПредыдущийЯзык;
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ДополнительныйЯзык2ПриИзменении(Элемент)
	
	Если СтрСравнить(ПредыдущийЯзык, ДополнительныйЯзык2) <> 0 Тогда
		Если СтрСравнить(ДополнительныйЯзык2, ДополнительныйЯзык1) = 0 Тогда
			ДополнительныйЯзык1 = ПредыдущийЯзык;
		ИначеЕсли СтрСравнить(ДополнительныйЯзык2, ОсновнойЯзык) = 0 Тогда
			ОсновнойЯзык = ПредыдущийЯзык;
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ДополнительныйЯзык2НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ПредыдущийЯзык = ДополнительныйЯзык2;
КонецПроцедуры

&НаКлиенте
Процедура ДополнительныйЯзык1НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ПредыдущийЯзык = ДополнительныйЯзык1;
КонецПроцедуры

&НаКлиенте
Процедура ЧасовойПоясПрограммыПриИзменении(Элемент)
	СмещениеЧасовогоПояса = СмещениеЧасовогоПояса(ЧасовойПоясПрограммы, ТекущиеВремяНаКлиенте());
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ОК(Команда)
	
	Если ДанныеКорректны() Тогда
		
		Если Источник = "ПанельАдминистрированияБСП" И ЗначенияКонстантИзменены() Тогда
			ПерезаполнитьДанные();
		Иначе
			ЗаписатьЗначенияКонстант();
			Закрыть(Новый Структура("Отказ", Ложь));
		КонецЕсли;
		
	Иначе
		ПоказатьПредупреждение(Неопределено, НСтр("ru = 'Указаны некорректные значения региональных настроек'"));
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиенте
Процедура УстановитьЗначенияПоУмолчанию()
	
	ЗаписатьЗначенияКонстант();
	Закрыть(Новый Структура("Отказ", Ложь));
	
КонецПроцедуры

&НаКлиенте
Процедура ПерезаполнитьДанные()
	
	ОчиститьСообщения();
	
	Элементы.Страницы.ТекущаяСтраница = Элементы.Ожидание;
	Элементы.ОК.Доступность = Ложь;
	
	Задание = ЗапуститьФоновоеПерезаполнениеНаСервере(УникальныйИдентификатор);
	
	НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	НастройкиОжидания.ВыводитьОкноОжидания = Ложь;
	
	Обработчик = Новый ОписаниеОповещения("ПослеФоновогоПерезаполнения", ЭтотОбъект);
	ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания);
	
КонецПроцедуры

&НаСервере
Функция ЗапуститьФоновоеПерезаполнениеНаСервере(Знач УникальныйИдентификатор)
	
	Если Не ПродолжитьИзменениеМультиязычныхРеквизитов Тогда
		СписокМетаданныхДляОбработки = ПодготовитьСписокМетаданныхДляОбработки(СтарыеИНовыеЗначенияКонстант());
		ЗаписатьЗначенияКонстант(СписокМетаданныхДляОбработки);
	КонецЕсли;

	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Перезаполнение строк предопределенных элементов и классификаторов.'");
	
	ФоновоеЗадание = ДлительныеОперации.ВыполнитьВФоне("МультиязычностьСервер.ИзменитьЯзыкВМультиязычныхРеквизитахКонфигурации",
		Новый Структура, ПараметрыВыполнения);
		
	Возврат ФоновоеЗадание;
	
КонецФункции

&НаСервере
Функция ПодготовитьСписокМетаданныхДляОбработки(СтарыеИНовыеЗначенияКонстант)
	
	ОбъектыСМультиязычнымиРеквизитами = МультиязычностьСервер.ИменаОбъектовСМультиязычнымиРеквизитами();
	
	ТекущиеСсылкиНаОбъекты = Новый Соответствие;
	
	Для Каждого ОбъектСМультиязычнымиРеквизитами Из ОбъектыСМультиязычнымиРеквизитами Цикл
		
		Настройки = Новый Структура;
		Настройки.Вставить("СсылкаНаПоследнийОбработанныйОбъекты", Неопределено);
		Настройки.Вставить("ЯзыковыеПоля", ОбъектСМультиязычнымиРеквизитами.Значение);
		
		ТекущиеСсылкиНаОбъекты.Вставить(ОбъектСМультиязычнымиРеквизитами.Ключ, Настройки);
	КонецЦикла;
	
	НастройкиОбработки = Новый Структура;
	НастройкиОбработки.Вставить("НастройкиИзмененияЯзыков", СтарыеИНовыеЗначенияКонстант);
	НастройкиОбработки.Вставить("Объекты", ТекущиеСсылкиНаОбъекты);
	
	Значение = Новый ХранилищеЗначения(НастройкиОбработки);
	
	Возврат Значение;
	
КонецФункции

&НаКлиенте
Процедура ПослеФоновогоПерезаполнения(Задание, ДополнительныеПараметры) Экспорт
	
	Если Задание = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Задание.Статус = "Выполнено" Тогда
	Элементы.Страницы.ТекущаяСтраница = Элементы.УспешноеЗавершение;
		ОбновитьПовторноИспользуемыеЗначения();
		
		Элементы.ОК.Видимость              = Ложь;
		Элементы.Закрыть.Видимость         = Истина;
		Элементы.Закрыть.КнопкаПоУмолчанию = Истина;
		ТекущийЭлемент = Элементы.Закрыть;
	ИначеЕсли Задание.Статус = "Ошибка" Тогда
		Элементы.Страницы.ТекущаяСтраница = Элементы.РегиональныеНастройки;
		ТекстОшибки = НСтр("ru = 'Не удается перезаполнить строки предопределенных элементов и классификаторов.'");
		ТекстОшибки = ТекстОшибки + Символы.ПС + НСтр("ru = 'Техническая информация:'") + Задание.ПодробноеПредставлениеОшибки;
		ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстОшибки);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Функция ДанныеКорректны()
	
	Если ПустаяСтрока(ОсновнойЯзык) Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Если ПустаяСтрока(ЧасовойПоясПрограммы) Тогда
		Возврат Ложь;
	КонецЕсли;
	
	УстановленныеЯзыки = Новый Соответствие;
	УстановленныеЯзыки.Вставить(ОсновнойЯзык, Истина);
	
	Если ИспользоватьДополнительныйЯзык1 Тогда
		Если ОсновнойЯзык = ДополнительныйЯзык1 Или ДополнительныйЯзык1 = ДополнительныйЯзык2 Тогда
			Возврат Ложь;
		КонецЕсли;
	КонецЕсли;
	
	Если ИспользоватьДополнительныйЯзык2 Тогда
		Если ОсновнойЯзык = ДополнительныйЯзык2 Или ДополнительныйЯзык1 = ДополнительныйЯзык2 Тогда
			Возврат Ложь;
		КонецЕсли;
	КонецЕсли;
	
	Возврат Истина;
	
КонецФункции

&НаСервере
Процедура ЗаписатьЗначенияКонстант(СписокМетаданныхДляОбработки = Неопределено)
	
	Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
		
		Если ЧасовойПоясПрограммы <> ПолучитьЧасовойПоясИнформационнойБазы() Тогда
			УстановитьПривилегированныйРежим(Истина);
			Попытка
				УстановитьМонопольныйРежим(Истина);
				УстановитьЧасовойПоясИнформационнойБазы(ЧасовойПоясПрограммы);
				УстановитьМонопольныйРежим(Ложь);
			Исключение
				УстановитьМонопольныйРежим(Ложь);
				ВызватьИсключение;
			КонецПопытки;
			УстановитьПривилегированныйРежим(Ложь);
			УстановитьЧасовойПоясСеанса(ЧасовойПоясПрограммы);
		КонецЕсли;
		
	Иначе
		
		УстановитьЧасовойПоясСеанса(ЧасовойПоясПрограммы);
		
	КонецЕсли;
	
	Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Или Не ОбщегоНазначения.РазделениеВключено() Тогда
		
		КодЯзыка1 = ?(ИспользоватьДополнительныйЯзык1, ДополнительныйЯзык1, "");
		КодЯзыка2 = ?(ИспользоватьДополнительныйЯзык2, ДополнительныйЯзык2, "");
		
		КодыЯзыков = Новый Массив;
		КодыЯзыков.Добавить(ОсновнойЯзык);
		Если ИспользоватьДополнительныйЯзык1 Тогда
			КодыЯзыков.Добавить(ДополнительныйЯзык1);
		КонецЕсли;
		Если ИспользоватьДополнительныйЯзык2 Тогда
			КодыЯзыков.Добавить(ДополнительныйЯзык2);
		КонецЕсли;
		
		НачатьТранзакцию();
		Попытка
			
			ПараметрыСеанса.ОсновнойЯзык = ОсновнойЯзык;
			
			Константы.ОсновнойЯзык.Установить(ОсновнойЯзык);
			
			Константы.ДополнительныйЯзык1.Установить(КодЯзыка1);
			Константы.ИспользоватьДополнительныйЯзык1.Установить(ИспользоватьДополнительныйЯзык1);
			
			Константы.ДополнительныйЯзык2.Установить(КодЯзыка2);
			Константы.ИспользоватьДополнительныйЯзык2.Установить(ИспользоватьДополнительныйЯзык2);
			
			Константы.ДанныеДляИзмененияМультиязычныхРеквизитов.Установить(СписокМетаданныхДляОбработки);
			
			Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
				Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
					МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
					МодульУправлениеПечатью.ДобавитьЯзыкиПечатныхФорм(КодыЯзыков);
				КонецЕсли;
			КонецЕсли;
			
			ЗафиксироватьТранзакцию();
			
		Исключение
			ОтменитьТранзакцию();
			ВызватьИсключение;
		КонецПопытки;
	
	КонецЕсли;
	
	ОбновитьПовторноИспользуемыеЗначения();
	
КонецПроцедуры

&НаСервере
Функция ЗначенияКонстантИзменены()
	
	Если Метаданные.Языки.Количество() = 1 Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Если СтрСравнить(Константы.ОсновнойЯзык.Получить(), ОсновнойЯзык) <> 0 Тогда
		Возврат Истина;
	КонецЕсли;
	
	Если (Константы.ИспользоватьДополнительныйЯзык1.Получить() = Ложь И ИспользоватьДополнительныйЯзык1 = Истина)
		Или (Константы.ИспользоватьДополнительныйЯзык2.Получить() = Ложь И ИспользоватьДополнительныйЯзык2 = Истина) Тогда
			Возврат Истина;
	КонецЕсли;
	
	Если ИспользоватьДополнительныйЯзык1
		И СтрСравнить(Константы.ДополнительныйЯзык1.Получить(), ДополнительныйЯзык1) <> 0 Тогда
			Возврат Истина;
	КонецЕсли;
	
	Если ИспользоватьДополнительныйЯзык2
		И СтрСравнить(Константы.ДополнительныйЯзык2.Получить(), ДополнительныйЯзык2) <> 0 Тогда
			Возврат Истина;
	КонецЕсли;
	
	Возврат Ложь;
	
КонецФункции


// Возвращаемое значение:
//   см. МультиязычностьСервер.ОписаниеСтарыхИНовыхНастроекЯзыков
//
&НаСервере
Функция СтарыеИНовыеЗначенияКонстант()
	
	Результат = МультиязычностьСервер.ОписаниеСтарыхИНовыхНастроекЯзыков();
	
	Результат.ОсновнойЯзыкСтароеЗначение= Константы.ОсновнойЯзык.Получить();
	Результат.ОсновнойЯзыкНовоеЗначение = ОсновнойЯзык;
	
	Результат.ДополнительныйЯзык1СтароеЗначение = Константы.ДополнительныйЯзык1.Получить();
	Результат.ДополнительныйЯзык1НовоеЗначение = ДополнительныйЯзык1;
	
	Результат.ДополнительныйЯзык2СтароеЗначение = Константы.ДополнительныйЯзык2.Получить();
	Результат.ДополнительныйЯзык2НовоеЗначение = ДополнительныйЯзык2;
	
	Возврат Результат;
	
КонецФункции

// Часовые пояса

&НаСервере
Процедура ЗаполнитьЧасовыеПояса()

	Для Каждого ОписаниеЧасовогоПояса Из ПолучитьДопустимыеЧасовыеПояса() Цикл
	
			СмещениеДатой = Дата(1, 1, 1) + СмещениеСтандартногоВремени(ОписаниеЧасовогоПояса); 
			ПредставлениеСмещения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("(UTC+%1)",
				Формат(СмещениеДатой, "ДФ=HH:mm; ДП=00:00;"));
	
			ПредставлениеЧасовогоПояса = ПредставлениеСмещения + " " + ОписаниеЧасовогоПояса;
			Элементы.ЧасовойПоясПрограммы.СписокВыбора.Добавить(ОписаниеЧасовогоПояса, ПредставлениеЧасовогоПояса);
			
	КонецЦикла;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция СмещениеЧасовогоПояса(ЧасовойПоясПрограммы, ВремяНаКлиенте)
	
	ДатаСеансаУниверсальная = УниверсальноеВремя(ТекущаяДатаСеанса(), ЧасовойПоясСеанса());
	ДатаСеансаНовыйЧасовойПояс = ДатаСеансаУниверсальная + СмещениеСтандартногоВремени(ЧасовойПоясПрограммы);

	Возврат ДатаСеансаНовыйЧасовойПояс - ВремяНаКлиенте + СмещениеЛетнегоВремени(ЧасовойПоясПрограммы);
	
КонецФункции

&НаКлиенте
Процедура УстановитьВремя()
	
	ВремяВыбранногоЧасовогоПояса = ТекущиеВремяНаКлиенте() + СмещениеЧасовогоПояса;
	ПодключитьОбработчикОжидания("УстановитьВремя", 1, Истина);
	
КонецПроцедуры

&НаКлиенте
Функция ТекущиеВремяНаКлиенте()

	// АПК:143-выкл -Требуется ТекущаяДата для расчета смещения отображаемого времени сеанса на форме.
	Возврат ТекущаяДата();
	// АПК:143-вкл 
	
КонецФункции

#КонецОбласти